<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8" />
        <meta http-equiv="X-UA-Compatible" content="IE=edge" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
        <title>Document</title>
        <script src="../js/vue2-dev.js"></script>
    </head>
    <body>
        <div id="root">
            <input v-model="num1" type="number" />
            <input v-model="num2.x" type="number" />
        </div>

        <script>
            const vm = new Vue({
                data: {
                    num1: 1,
                    num2: {
                        x: 2,
                    },
                },
                computed: {
                    num2_data() {
                        return JSON.parse(JSON.stringify(this.num2));
                    },
                },
                watch: {
                    num1: {
                        handler(newValue, oldValue) {
                            console.log("newValue：" + newValue);
                            console.log("oldValue：" + oldValue);
                        },
                    },
                    // 对于深度监视，必须配合计算属性，先给对象数据序列化，再反序列化返回
                    // 否则 newVlue 和 oldValue 是一样的，因为记录的是num2所指向的地址，不会保存之前的值
                    num2_data: {
                        // 开启深度监视，不仅监视num2数组，还有num2数组的相关地址的数据
                        deep: true,
                        // 模板解析完毕立刻执行
                        immediate: true,
                        handler(newValue, oldValue) {
                            console.log("newValue：" + newValue.x);
                            console.log(
                                "oldValue：" +
                                    (oldValue == undefined
                                        ? undefined
                                        : oldValue.x)
                            );
                        },
                    },
                },
            });

            vm.$mount("#root");
        </script>
    </body>
</html>
